package com.qijian.flowable.service;

import com.qijian.flowable.common.enums.CommentTypeEnum;
import com.qijian.flowable.domain.vo.*;
import org.flowable.engine.task.Comment;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;

import java.util.List;

/**
 * @author 庄金明
 * @date 2020年3月23日
 */
public interface IFlowableTaskService {
    /**
     * 查询任务详情
     *
     * @param taskId /
     * @return /
     */
    TaskResponse getTask(String taskId);

    /**
     * 查询子任务列表
     *
     * @param taskId /
     * @return /
     */
    List<TaskResponse> getSubTasks(String taskId);

    /**
     * 修改任务
     *
     * @param vo /
     * @return /
     */
    TaskResponse updateTask(TaskUpdateVo vo);

    /**
     * 转办任务
     *
     * @param vo /
     */
    void assignTask(TaskVo vo);

    void resolvedTask(TaskVo vo);


    void finishForward(TaskVo vo);

    /**
     * 新增任务参与人
     *
     * @param taskId        /
     * @param involveUserId /
     */
    void involveUser(String taskId, String involveUserId);

    /**
     * 移除任务参与人
     *
     * @param taskId        /
     * @param involveUserId /
     */
    void removeInvolvedUser(String taskId, String involveUserId);

    /**
     * 认领任务
     *
     * @param vo /
     */
    void claimTask(TaskVo vo);

    /**
     * 取消认领
     *
     * @param vo /
     */
    void unclaimTask(TaskVo vo);

    /**
     * 新增任务关联人
     *
     * @param task     /
     * @param userId   /
     * @param linkType /
     */
    void addIdentiyLinkForUser(Task task, String userId, String linkType);

    /**
     * 委派任务
     *
     * @param vo /
     */
    void delegateTask(TaskVo vo);


    void forwardTask(List<TaskVo> taskRequests);

    /**
     * 完成任务
     *
     * @param vo /
     */
    void completeTask(TaskVo vo, String userId);

    void completeTaskSystem(TaskVo vo, int jobLevel);

    void completeTaskAdmin(TaskVo vo, boolean isActive);

    /**
     * 删除任务
     *
     * @param taskId /
     */
    void deleteTask(String taskId);

    /**
     * 终止流程
     *
     * @param vo /
     */
    void stopProcessInstance(TaskVo vo);

    void stopProcessInstance(TaskVo vo,Long userId);

    /**
     * 查询可退回节点
     *
     * @param taskId /
     * @return /
     */
    List<FlowNodeResponse> getBackNodes(String taskId);

    /**
     * 退回任务
     *
     * @param vo /
     */
    void backTask(TaskVo vo);


    void withdraw(TaskVo vo);



    void refuseTask(TaskVo vo);

    /**
     * 查询单一任务详情
     *
     * @param taskId /
     * @return /
     */
    Task getTaskNotNull(String taskId);

    /**
     * 查询单一历史任务详情
     *
     * @param taskId /
     * @return /
     */
    HistoricTaskInstance getHistoricTaskInstanceNotNull(String taskId);

    /**
     * 新增过程意见
     *
     * @param taskId            /
     * @param processInstanceId /
     * @param userId            /
     * @param type              /
     * @param message           /
     */
    void addComment(String taskId, String processInstanceId, String userId, CommentTypeEnum type, String message);

    /**
     * 查询过程意见
     *
     * @param taskId            /
     * @param processInstanceId /
     * @param type              /
     * @param userId            /
     * @return /
     */
    List<Comment> getComments(String taskId, String processInstanceId, String type, String userId);

    /**
     * 新增任务关联信息
     *
     * @param taskIdentityRequest /
     */
    void saveTaskIdentityLink(IdentityVo taskIdentityRequest);

    /**
     * 删除任务关联信息
     *
     * @param taskId       /
     * @param identityId   /
     * @param identityType /
     */
    void deleteTaskIdentityLink(String taskId, String identityId, String identityType);

    /**
     * 任务已阅
     *
     * @param vo /
     */
    void readTask(TaskVo vo);

    /**
     * 催办
     *
     * @param vo /
     */
    void urging(TaskVo vo);
}
